/* * Copyright (C) 2012 www.amsoft.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ab.util; import android.app.Activity; import android.content.Context; import android.graphics.PixelFormat; import android.os.Handler; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.WindowManager; import com.ab.view.app.AbMonitorView; // TODO: Auto-generated Javadoc /** * © 2012 amsoft.cn * 名称:AbMonitorUtil.java * 描述:应用监控类. * * @author 还如一梦中 * @version v1.0 * @date:2014-07-30 下午11:52:13 */ public final class AbMonitorUtil { /** 性能测试开关状态. */ public static boolean mMonitorOpened = false; /** 帧测试View. */ private static AbMonitorView mAbMonitorView = null; /** 帧测试Handler. */ private static Handler mMonitorHandler = new Handler(); /** 帧测试线程. */ private static Runnable mMonitorRunnable = null; /** Window 管理器. */ private static WindowManager mWindowManager = null; /** 帧测试参数. */ private static WindowManager.LayoutParams mMonitorParams = null; /** * 描述:打开关闭帧数测试 * <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> * lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG * */ public static void openMonitor(Context context){ if(mMonitorOpened){ return; } mWindowManager = ((Activity)context).getWindowManager(); DisplayMetrics display = AbAppUtil.getDisplayMetrics(context); final int diaplayWidth = display.widthPixels; mAbMonitorView = new AbMonitorView(context); mMonitorParams = new WindowManager.LayoutParams(); // 设置window type mMonitorParams.type = WindowManager.LayoutParams.TYPE_PHONE; /* * 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; * 那么优先级会降低一些, 即拉下通知栏不可见 */ //设置图片格式,效果为背景透明 mMonitorParams.format = PixelFormat.RGBA_8888; // 设置Window flag mMonitorParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; /* * 下面的flags属性的效果形同“锁定”。 * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。 wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE; */ // 设置悬浮窗的长得宽 mMonitorParams.width = AbViewUtil.scaleValue(context, 100); mMonitorParams.height = AbViewUtil.scaleValue(context, 50); mWindowManager.addView(mAbMonitorView, mMonitorParams); mMonitorOpened = true; mMonitorRunnable = new Runnable() { @Override public void run() { mAbMonitorView.postInvalidate(); mMonitorHandler.postDelayed(this,0); } }; mMonitorHandler.postDelayed(mMonitorRunnable,0); mAbMonitorView.setOnTouchListener(new OnTouchListener() { int lastX, lastY; int paramX, paramY; public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); paramX = mMonitorParams.x; paramY = mMonitorParams.y; break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; if ((paramX + dx) > diaplayWidth/2 ) { mMonitorParams.x = diaplayWidth; }else { mMonitorParams.x = 0; } mMonitorParams.x = paramX + dx; mMonitorParams.y = paramY + dy; // 更新悬浮窗位置 mWindowManager.updateViewLayout(mAbMonitorView, mMonitorParams); break; } return true; } }); } /** * 描述:关闭帧数测试. */ public static void closeMonitor(){ if(mMonitorOpened) { if(mWindowManager != null && mAbMonitorView != null){ mWindowManager.removeView(mAbMonitorView); } mMonitorOpened = false; if(mMonitorHandler != null && mMonitorRunnable != null){ mMonitorHandler.removeCallbacks(mMonitorRunnable); } } } }